package gestionnaire;
import java.util.ArrayDeque;

import memento.Memento;
import receiver.ME;

/**
 * offre les services de undo et Redo
 * Cette classe applique le pathern singleton
 * @author camara
 *@version 3
 */

//application du design pattern :
//command : receiver
// mememto CareTacker
public class Gestionnaire {

	//on utilise deux piles
	//l'une contenant les etats sauvegarder
	//et l'autre les etat defais
	
	/**
	 * liste des etats sauvegarder (fait)
	 */
	private java.util.ArrayDeque<Memento> etatsFais;
	
	/**
	 * liste des etats defais
	 */
	private java.util.ArrayDeque<Memento> etatsDeFais;
	/**
	 * le moteur d'edition à gérer
	 */
	private ME moteur;
	/**
	 * instance unique de la classe
	 */
	public static Gestionnaire instance;
	
	private  Gestionnaire() {
		etatsFais = new ArrayDeque<Memento>();
		etatsDeFais = new ArrayDeque<Memento>();
	}
	
	public static Gestionnaire getInstance() {
		if(instance == null){
			instance = new Gestionnaire();
		}
		return instance;			
	}

	
	/**
	 * sauvegarde l'etat du moteur d'edition.
	 * Cette methode est invoquer apres chaque commende
	 * annulable
	 * @throws CloneNotSupportedException 
	 */
	public void sauvegarder() throws CloneNotSupportedException{
		etatsFais.push(moteur.getMemento());  
		//on renitialise les defait
		etatsDeFais.clear();
		System.out.println("etat sauvegardés : "+ etatsFais.size());
	}
	
	/**
	 * restaure l'etat du moteur d'edition à l'etat anterieur le plus proche
	 * @throws CloneNotSupportedException
	 */
	public void defaire() throws CloneNotSupportedException{
		if(etatsFais.size() == 0)
			return;
		//on retire un etat de la liste etatsFais		
		Memento defais = etatsFais.poll();
		
		//on enregistre l'etat courant
		etatsDeFais.push(moteur.getMemento());
		
		//on l'ajoute à la liste etasDefais
		//etatsDeFais.push(defais);	
				
		moteur.setMemento(defais);
		
		//System.out.println("defaire : etats fais : "+ etatsFais.size()+ " etat defait: "+etatsDeFais.size());
	
	}
	/**
	 * reviens sur la dernière annulation d'etat du moteur d'edition
	 * @throws CloneNotSupportedException
	 */
	public void refaire() throws CloneNotSupportedException{
		if(etatsDeFais.size() == 0)
			return;
		//on retire un etat de la liste etatsDeFais
		Memento refais = etatsDeFais.poll();
		//on l'ajoute à la liste etasfais
		
		moteur.setMemento(refais);
		etatsFais.push(refais);

		//System.out.println("refaire : etats fais : "+ etatsFais.size()+ " etat defait: "+etatsDeFais.size());
		
	}
	
	public void setME(ME me){
		this.moteur = me;
	}
}
